package com.example.security;

import org.springframework.security.access.AccessDecisionVoter;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.FilterInvocation;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;

/**
 * <p>自定义投票器</p>
 * 权限封装在SecurityMetadataSource中，这是一个接口，有一个借口实现他叫FilterInvocationSecurityMetadataSource
 * FileterInvocationSecurityMetadataSource中getAttributes方法获取本次登录所需权限，
 * 然后可以在AccessDecisionVoter中的vote方法中获取用户对应的权限，
 * 和所需权限比较，如果有所需权限之中的一个，可以通过，没有可以返回拒绝或者null
 *
 */


public class CustomDynamicRoleVoter implements
        AccessDecisionVoter<Object> {
    @Override
    public boolean supports(ConfigAttribute configAttribute) {
        return true;
    }

    @Override
    public boolean supports(Class<?> aClass) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> collection) {
        int result = ACCESS_ABSTAIN;

        // 获取登录的用户名称
        String userId = authentication.getName();
        // 这里仅作演示，除了anonymousUser都放行
        if (userId != null && !"anonymousUser".equals(userId)) {
            //granted表示授权，还有拒绝和弃权。
            result = ACCESS_GRANTED;
        }
        return result;
    }
}
